library(tidyverse)
library(taxonomizr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
genome_data <- read_csv("../data/mmetsp_ncbi_genome_info.csv") %>%
  mutate_at("sample_id", as.character)

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_character(),
  sample_id = col_double(),
  `GenBank BioSample` = col_double(),
  project_id = col_double(),
  latitude = col_double(),
  longitude = col_double(),
  taxon_id = col_double(),
  depth = col_double(),
  day_portion_of_day_night_cycle_in_hours = col_double(),
  light = col_double(),
  experimental_salinity = col_double(),
  experimental_temperature = col_double(),
  night_portion_of_day_night_cycle_in_hours = col_double(),
  ph = col_double(),
  environmental_salinity = col_double(),
  collection_time = col_time(format = ""),
  environmental_temperature = col_double(),
  phosphate = col_double(),
  nitrate = col_double(),
  iron = col_double(),
  trace_elements = col_double()
  # ... with 21 more columns
)
ℹ Use `spec()` for the full column specifications.
genome_data
report_filenames <- list.files("../results/krakenReports/")
report <- NULL

for(filename in report_filenames){
  data <- read_tsv(file.path("../results/krakenReports", filename),
                   col_names = c("percent", "clade_count", "taxon_count", "kmers", "unique_kmers", "level", "taxid", "name" ))
  
  data$file <- filename
  
  
  report <- bind_rows(report, data)
  
}

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  percent = col_double(),
  clade_count = col_double(),
  taxon_count = col_double(),
  kmers = col_double(),
  unique_kmers = col_double(),
  level = col_character(),
  taxid = col_double(),
  name = col_character()
)
report <- report %>%
  mutate(duplicity = kmers/unique_kmers,
         ratio_unique = unique_kmers/kmers,
         taxid = as.character(taxid)) %>%
  separate(file, c("sample_id", "sample_name_main", "fullSpeciesName"), sep = "_-_", remove = F) %>%
  filter(clade_count > 1)

taxonomyInfo <- getTaxonomy(unique(report$taxid), sqlFile = "../data/accessionTaxa.sql") %>%
  data.frame(taxid = row.names(.), row.names = NULL) %>%
  # remove spaces in taxid
  mutate(taxid = str_trim(taxid))

report <- report %>%
  left_join(., taxonomyInfo, by = "taxid") %>%
  left_join(., genome_data[, c("sample_id", "taxon_id")], by = "sample_id") %>%
  left_join(., genome_data[, c("sample_id", "species_taxid")], by = "sample_id") %>%
  rename(target_taxid = taxon_id,
         target_species_taxid = species_taxid) %>%
  mutate(is_target_species = (taxid == target_taxid | taxid == target_species_taxid))

report
report %>%
  filter(superkingdom == "Bacteria")
nrow(report)
[1] 70584
sum(report$is_target_species)
[1] 24
taxonomyInfo <- getTaxonomy(unique(report$taxid), sqlFile = "../data/accessionTaxa.sql") %>%
  data.frame(taxid = row.names(.), row.names = NULL) %>%
  # remove spaces in taxid
  mutate(taxid = str_trim(taxid))

taxonomyInfo
write_csv(report, "../data/duplicity_report.csv")
report %>%
  filter(superkingdom == "Bacteria")
report %>%
  filter(superkingdom == "Bacteria",
         grepl("^(S|G).*", level)) %>%
  ggplot(aes(x = taxon_count/unique_kmers))+
  geom_histogram(bins = 30)+
  #geom_density()+
  xlim(0, 10)

report %>%
  filter(
         is_target_species) %>%
  ggplot(aes(x = log(taxon_count)))+
  geom_histogram(bins = 30)#+

  #geom_density()+
  #xlim(0, 10)
report %>%
  filter(superkingdom == "Bacteria",
         grepl("^(S|G).*", level),
         taxon_count != 0) %>%
  ggplot(aes(x =log10(taxon_count)))+
  geom_histogram(bins = 30)+
  #geom_density()+
  xlim(0, 10)+
  ylim(0,5000)

report %>%
  filter(superkingdom == "Bacteria",
         taxon_count/unique_kmers != 0) %>%
  ggplot(aes(x = log(taxon_count/unique_kmers)))+
  geom_histogram(bins = 30)+
  #geom_density()+
  xlim(0, 10)

report %>%
  filter(superkingdom == "Bacteria",
         taxon_count/unique_kmers != 0) %>%
  ggplot(aes(x = (taxon_count/unique_kmers)))+
  geom_histogram(bins = 30)+
  #geom_density()+
  xlim(0, 100)+
  ylim(0, 5000)

report %>%
  filter(superkingdom == "Bacteria") %>%
  ggplot(aes(x = log(clade_count)))+
  geom_histogram(bins = 30)+
  #geom_density()+
  xlim(0, 10)

report %>%
  filter(!is_target_species,
         duplicity > 0) %>%
  ggplot(aes(x = (duplicity)))+
  geom_histogram()+
  scale_x_log10()


report %>%
  #filter(is_target_species) %>%
  ggplot(aes(x = duplicity))+
  facet_wrap(~ifelse(is_target_species,"Target Species", "Other Species"), scales = "free_y")+
  geom_histogram()+
  scale_x_continuous(labels = scales::number_format(accuracy = 1),
                     trans = "log10",
                     limits = c(1, 1000),
                     n.breaks = 8)+
  theme_bw()

report %>%
  #filter(is_target_species) %>%
  ggplot(aes(x = taxon_count))+
  facet_wrap(~ifelse(is_target_species,"Target Species", "Other Species"), scales = "free_y", "free_x")+
  geom_histogram()+
  scale_x_continuous(labels = scales::number_format(accuracy = 1),
                     trans = "log10")+
  theme_bw()
Coercing `nrow` to be an integer.NAs introduced by coercion`nrow` is missing or less than 1 and will be treated as NULL.

report %>%
  filter(!is_target_species) %>%
  ggplot(aes(x = taxon_count))+
  geom_histogram()+
    scale_x_continuous(labels = scales::number_format(accuracy = 1),
                     #trans = "log10",
                     n.breaks = 10,
                     limits = c(1, 500))+
  theme_bw()

report %>%
  filter(superkingdom == "Bacteria") %>%
  ggplot(aes(x = (duplicity)))+
  geom_histogram(bins = 45)+
  #geom_density()+
  xlim(0, 50)
report %>%
  filter(superkingdom == "Bacteria") %>%
  ggplot(aes(x = log(unique_kmers)))+
  geom_histogram(bins = 30) +
  xlim(0, 10)
exp(2.5)
report %>%
  filter(superkingdom == "Bacteria") %>%
  ggplot(aes(x = log(unique_kmers)))+
  geom_histogram(bins = 30) +
  xlim(0, 10)
report %>%
  ggplot(aes(x = log(unique_kmers)))+
  geom_histogram(bins = 50)# +
  xlim(0,25)
nrow(report)
unique(report$level)
report %>%
  filter(clade_count > 200,
         taxon_count > 10,
         unique_kmers > 10,
         duplicity < 70
         )
report %>%
  filter(superkingdom %in% c("Archaea", "Bacteria"),
         clade_count > 1000,
         taxon_count > 500,
         unique_kmers > 10,
         duplicity < 10,
         grepl("^(S|G).*", level)
         #level %in% c("G","G1", "G2", "S", "S1", "S2", "S3")
         )
report %>%
  ggplot(aes(x = duplicity))+
  geom_histogram(bins = 30) +
  #geom_density()+
  xlim(0, 100)
report %>%
  ggplot(aes(x = ratio_unique))+
  geom_histogram(bins = 30)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGF4b25vbWl6cikKCmBgYAoKYGBge3J9Cmdlbm9tZV9kYXRhIDwtIHJlYWRfY3N2KCIuLi9kYXRhL21tZXRzcF9uY2JpX2dlbm9tZV9pbmZvLmNzdiIpICU+JQogIG11dGF0ZV9hdCgic2FtcGxlX2lkIiwgYXMuY2hhcmFjdGVyKQpnZW5vbWVfZGF0YQpgYGAKCgpgYGB7cn0KcmVwb3J0X2ZpbGVuYW1lcyA8LSBsaXN0LmZpbGVzKCIuLi9yZXN1bHRzL2tyYWtlblJlcG9ydHMvIikKYGBgCgpgYGB7cn0KcmVwb3J0IDwtIE5VTEwKCmZvcihmaWxlbmFtZSBpbiByZXBvcnRfZmlsZW5hbWVzKXsKICBkYXRhIDwtIHJlYWRfdHN2KGZpbGUucGF0aCgiLi4vcmVzdWx0cy9rcmFrZW5SZXBvcnRzIiwgZmlsZW5hbWUpLAogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gYygicGVyY2VudCIsICJjbGFkZV9jb3VudCIsICJ0YXhvbl9jb3VudCIsICJrbWVycyIsICJ1bmlxdWVfa21lcnMiLCAibGV2ZWwiLCAidGF4aWQiLCAibmFtZSIgKSkKICAKICBkYXRhJGZpbGUgPC0gZmlsZW5hbWUKICAKICByZXBvcnQgPC0gYmluZF9yb3dzKHJlcG9ydCwgZGF0YSkKICAKfQoKcmVwb3J0IDwtIHJlcG9ydCAlPiUKICBtdXRhdGUoZHVwbGljaXR5ID0ga21lcnMvdW5pcXVlX2ttZXJzLAogICAgICAgICByYXRpb191bmlxdWUgPSB1bmlxdWVfa21lcnMva21lcnMsCiAgICAgICAgIHRheGlkID0gYXMuY2hhcmFjdGVyKHRheGlkKSkgJT4lCiAgc2VwYXJhdGUoZmlsZSwgYygic2FtcGxlX2lkIiwgInNhbXBsZV9uYW1lX21haW4iLCAiZnVsbFNwZWNpZXNOYW1lIiksIHNlcCA9ICJfLV8iLCByZW1vdmUgPSBGKSAlPiUKICBmaWx0ZXIoY2xhZGVfY291bnQgPiAxKQoKdGF4b25vbXlJbmZvIDwtIGdldFRheG9ub215KHVuaXF1ZShyZXBvcnQkdGF4aWQpLCBzcWxGaWxlID0gIi4uL2RhdGEvYWNjZXNzaW9uVGF4YS5zcWwiKSAlPiUKICBkYXRhLmZyYW1lKHRheGlkID0gcm93Lm5hbWVzKC4pLCByb3cubmFtZXMgPSBOVUxMKSAlPiUKICAjIHJlbW92ZSBzcGFjZXMgaW4gdGF4aWQKICBtdXRhdGUodGF4aWQgPSBzdHJfdHJpbSh0YXhpZCkpCgpyZXBvcnQgPC0gcmVwb3J0ICU+JQogIGxlZnRfam9pbiguLCB0YXhvbm9teUluZm8sIGJ5ID0gInRheGlkIikgJT4lCiAgbGVmdF9qb2luKC4sIGdlbm9tZV9kYXRhWywgYygic2FtcGxlX2lkIiwgInRheG9uX2lkIildLCBieSA9ICJzYW1wbGVfaWQiKSAlPiUKICBsZWZ0X2pvaW4oLiwgZ2Vub21lX2RhdGFbLCBjKCJzYW1wbGVfaWQiLCAic3BlY2llc190YXhpZCIpXSwgYnkgPSAic2FtcGxlX2lkIikgJT4lCiAgcmVuYW1lKHRhcmdldF90YXhpZCA9IHRheG9uX2lkLAogICAgICAgICB0YXJnZXRfc3BlY2llc190YXhpZCA9IHNwZWNpZXNfdGF4aWQpICU+JQogIG11dGF0ZShpc190YXJnZXRfc3BlY2llcyA9ICh0YXhpZCA9PSB0YXJnZXRfdGF4aWQgfCB0YXhpZCA9PSB0YXJnZXRfc3BlY2llc190YXhpZCkpCgpyZXBvcnQKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikKYGBgCgpgYGB7cn0KbnJvdyhyZXBvcnQpCnN1bShyZXBvcnQkaXNfdGFyZ2V0X3NwZWNpZXMpCmBgYAoKCmBgYHtyfQp0YXhvbm9teUluZm8gPC0gZ2V0VGF4b25vbXkodW5pcXVlKHJlcG9ydCR0YXhpZCksIHNxbEZpbGUgPSAiLi4vZGF0YS9hY2Nlc3Npb25UYXhhLnNxbCIpICU+JQogIGRhdGEuZnJhbWUodGF4aWQgPSByb3cubmFtZXMoLiksIHJvdy5uYW1lcyA9IE5VTEwpICU+JQogICMgcmVtb3ZlIHNwYWNlcyBpbiB0YXhpZAogIG11dGF0ZSh0YXhpZCA9IHN0cl90cmltKHRheGlkKSkgCgp0YXhvbm9teUluZm8KYGBgCmBgYHtyfQp3cml0ZV9jc3YocmVwb3J0LCAiLi4vZGF0YS9kdXBsaWNpdHlfcmVwb3J0LmNzdiIpCmBgYAoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIiwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0YXhvbl9jb3VudC91bmlxdWVfa21lcnMpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApKwogICNnZW9tX2RlbnNpdHkoKSsKICB4bGltKDAsIDEwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZmlsdGVyKAogICAgICAgICBpc190YXJnZXRfc3BlY2llcykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHRheG9uX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkjKwogICNnZW9tX2RlbnNpdHkoKSsKICAjeGxpbSgwLCAxMCkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIiwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpLAogICAgICAgICB0YXhvbl9jb3VudCAhPSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPWxvZzEwKHRheG9uX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApKwogIHlsaW0oMCw1MDAwKQpgYGAKCgoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIsCiAgICAgICAgIHRheG9uX2NvdW50L3VuaXF1ZV9rbWVycyAhPSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsb2codGF4b25fY291bnQvdW5pcXVlX2ttZXJzKSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApCmBgYAoKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZmlsdGVyKHN1cGVya2luZ2RvbSA9PSAiQmFjdGVyaWEiLAogICAgICAgICB0YXhvbl9jb3VudC91bmlxdWVfa21lcnMgIT0gMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gKHRheG9uX2NvdW50L3VuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApKwogICNnZW9tX2RlbnNpdHkoKSsKICB4bGltKDAsIDEwMCkrCiAgeWxpbSgwLCA1MDAwKQoKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKGNsYWRlX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcighaXNfdGFyZ2V0X3NwZWNpZXMsCiAgICAgICAgIGR1cGxpY2l0eSA+IDApICU+JQogIGdncGxvdChhZXMoeCA9IChkdXBsaWNpdHkpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICBzY2FsZV94X2xvZzEwKCkKYGBgCgpgYGB7cn0KCnJlcG9ydCAlPiUKICAjZmlsdGVyKGlzX3RhcmdldF9zcGVjaWVzKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkdXBsaWNpdHkpKSsKICBmYWNldF93cmFwKH5pZmVsc2UoaXNfdGFyZ2V0X3NwZWNpZXMsIlRhcmdldCBTcGVjaWVzIiwgIk90aGVyIFNwZWNpZXMiKSwgc2NhbGVzID0gImZyZWVfeSIpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMTAwMCksCiAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCkrCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgI2ZpbHRlcihpc190YXJnZXRfc3BlY2llcykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGF4b25fY291bnQpKSsKICBmYWNldF93cmFwKH5pZmVsc2UoaXNfdGFyZ2V0X3NwZWNpZXMsIlRhcmdldCBTcGVjaWVzIiwgIk90aGVyIFNwZWNpZXMiKSwgc2NhbGVzID0gImZyZWVfeSIsICJmcmVlX3giKSsKICBnZW9tX2hpc3RvZ3JhbSgpKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsKICB0aGVtZV9idygpCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcighaXNfdGFyZ2V0X3NwZWNpZXMpICU+JQogIGdncGxvdChhZXMoeCA9IHRheG9uX2NvdW50KSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgI3RyYW5zID0gImxvZzEwIiwKICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMCwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCA1MDApKSsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQogIGdncGxvdChhZXMoeCA9IChkdXBsaWNpdHkpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQ1KSsKICAjZ2VvbV9kZW5zaXR5KCkrCiAgeGxpbSgwLCA1MCkKYGBgCgoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQogIGdncGxvdChhZXMoeCA9IGxvZyh1bmlxdWVfa21lcnMpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKSArCiAgeGxpbSgwLCAxMCkKYGBgCgpgYGB7cn0KZXhwKDIuNSkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHVuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApICsKICB4bGltKDAsIDEwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHVuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gNTApIyArCiAgeGxpbSgwLDI1KQpgYGAKYGBge3J9Cm5yb3cocmVwb3J0KQpgYGAKCgpgYGB7cn0KdW5pcXVlKHJlcG9ydCRsZXZlbCkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihjbGFkZV9jb3VudCA+IDIwMCwKICAgICAgICAgdGF4b25fY291bnQgPiAxMCwKICAgICAgICAgdW5pcXVlX2ttZXJzID4gMTAsCiAgICAgICAgIGR1cGxpY2l0eSA8IDcwCiAgICAgICAgICkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gJWluJSBjKCJBcmNoYWVhIiwgIkJhY3RlcmlhIiksCiAgICAgICAgIGNsYWRlX2NvdW50ID4gMTAwMCwKICAgICAgICAgdGF4b25fY291bnQgPiA1MDAsCiAgICAgICAgIHVuaXF1ZV9rbWVycyA+IDEwLAogICAgICAgICBkdXBsaWNpdHkgPCAxMCwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpCiAgICAgICAgICNsZXZlbCAlaW4lIGMoIkciLCJHMSIsICJHMiIsICJTIiwgIlMxIiwgIlMyIiwgIlMzIikKICAgICAgICAgKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZHVwbGljaXR5KSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKSArCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTAwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmF0aW9fdW5pcXVlKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKQpgYGAKCg==